package com.keensense.vcm.model;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import com.keensense.vcm.model.enums.SortEnum;

/**
 * @author lanjian
 * @date 2020/5/6 4:41 下午
 */
@XmlRootElement(name = "request")
public class VehicleSearchRequest {

    @XmlElement(name = "page")
    private Page page;

    @XmlElement(name = "condition")
    private Condition condition;

    private VehicleSearchRequest() {}

    public VehicleSearchRequest(Page page, Condition condition) {
        this.page = page;
        this.condition = condition;
    }

    public void setPage(Page page) {
        this.page = page;
    }

    public void setCondition(Condition condition) {
        this.condition = condition;
    }

    @XmlTransient
    public Page getPage() {
        return page;
    }

    @XmlTransient
    public Condition getCondition() {
        return condition;
    }

    public static class Page {

        @XmlElement
        private int currentPage;

        @XmlElement
        private int pageSize;

        @XmlElement
        private SortEnum sortOrder = SortEnum.desc;

        public Page(int currentPage, int pageSize) {
            this.currentPage = currentPage;
            this.pageSize = pageSize;
        }
    }

    /**
     * 查询条件
     */
    public static class Condition {

        public Condition(long startTime, long endTime) {
            this.startTime = startTime;
            this.endTime = endTime;
        }

        /**
         * 创建时间开始 当fileIdList参数为空时，需要指定startTime和endTime，表示检索指定IPC起止时间段内所分析产生的过车数据 例如1507729126653
         */
        @XmlElement
        private Long startTime;

        /**
         * 创建时间结束 当fileIdList参数为空时，需要指定startTime和endTime，表示检索指定IPC起止时间段内所分析产生的过车数据，例如1507729126653，时间跨度最高为92天。
         */
        @XmlElement
        private Long endTime;

        /**
         * 来源设备 -1代表不限 0:文件 1:普通摄像机 2:虚拟卡口（不支持） 若不填写该字段，表示不限
         */
        @XmlElement
        private Integer deviceSource;

        /**
         * 车牌号码 -1 代表不限(当前只支持中文、英文、数字这三种字符以及通配符*和？，长度限制为20个字符)
         */
        @XmlElement
        private String pnr;

        /**
         * 车辆颜色列表
         */
        @XmlElementWrapper(name = "colorList")
        @XmlElement(name = "color")
        private List<String> colorList;

        /**
         * 行驶方向; -1代表不限 0:未知 1:左 2:右 3:上4:下
         */
        @XmlElement
        private String direc;

        /**
         * 车牌类型; -1代表不限 0:未知类型 1:单层蓝牌 2:单层黑牌 3:单层黄牌 4:双层黄牌 5:白色警牌 6:白色武警 7:个性化车牌 （目前不支持） 8:单层军牌 9:双层军牌 10:领事馆牌 11:港牌
         * 12:农用车牌 拖拉机（目前不支持） 13:澳门牌 14：场内牌（目前不支持） 15：双层白色武警 16：其他类型 17：新能源牌 18：教练汽车车牌19：挂车车牌
         */
        @XmlElement(name = "ptype")
        private String pType;

        /**
         * 车牌颜色； -1代表不限 0:白 2:黄 5:绿 6:蓝 8:黑 9:未知 10：渐变绿 11：黄绿双拼
         */
        @XmlElement(name = "pcolor")
        private String pColor;

        /**
         * 告警时间开始
         */
        @XmlElement
        private Long createTime;

        /**
         * 告警时间结束
         */
        @XmlElement(name = "endcreateTime")
        private Long endCreateTime;

        /**
         * 告警产生时生成的ID 当过车记录关联告警时存在，否则该字段不存在
         */
        @XmlElement
        private String alarmId;

        /**
         * 车辆类型 -1代表不限 0:未知 1:轿车 2:货车（大型货车） 3:面包车（微面） 4:客车 5:小货车 6:SUV 7:中型客车（轻客、小型客车） 8:摩托车 9:其他 10:越野车 11:商务车 12:三轮车
         * 13:皮卡车 14:挂车 15:混凝土搅拌车 16:罐车 17:随车吊 18:新能源车 19:非机动车 20:工程车
         */
        @XmlElement(name = "cartype")
        private String carType;

        /**
         * 车辆品牌，可通过数据字典查询支持车辆品牌,-1代表不限
         */
        @XmlElement(name = "vehiclebrand")
        private String vehicleBrand;

        /**
         * 车辆型号,可通过数据字典查询支持车辆型号,-1代表不限
         */
        @XmlElement
        private String vehicleSub;

        /**
         * 主驾驶遮阳板 -1代表不限 0无 1有
         */
        @XmlElement(name = "sunvisor")
        private Integer sunVisor;

        /**
         * 副驾驶遮阳板 -1代表不限 0无 1有
         */
        @XmlElement(name = "vicesunvisor")
        private Integer viceSunVisor;

        /**
         * 挂件 -1代表不限 0无 1有
         */
        @XmlElement(name = "carpendant")
        private Integer carPendant;

        /**
         * 摆件 -1代表不限 0无 1有
         */
        @XmlElement
        private Integer goods;

        /**
         * 年检标 -1代表不限 0无 1有
         */
        @XmlElement(name = "yearlogo")
        private Integer yearLogo;

        /**
         * 年款 -1代表无限，例：2014 0代表未知
         */
        @XmlElement(name = "year")
        private String year;

        /**
         * 当deviceSource的值为1或-1时，此条件生效，其余情况不生效，摄像机编码多个Id可以用;分隔（包含数字、字母，特殊字符； #），最多支持1000个Id。 该字段不填写时，表示 选择所有相机
         */
        @XmlElement
        private String cameraSn;

        /**
         * 主驾驶是否有人 -1：不限 0：无 1：有
         */
        @XmlElement(name = "maindriver")
        private Integer mainDriver;

        /**
         * 副驾驶是否有人 -1：不限 0：无 1：有
         */
        @XmlElement(name = "vicedriver")
        private Integer viceDriver;

        /**
         * 驾驶员打手机，-1：不限0：不存在 1：存在
         */
        @XmlElement(name = "maincall")
        private Integer mainCall;

        /**
         * 主驾驶安全带，-1：不限0：不存在 1：存在
         */
        @XmlElement(name = "mainbelt")
        private Integer mainBelt;

        /**
         * 副驾驶安全带，-1：不限0：不存在 1：存在
         */
        @XmlElement(name = "vicebelt")
        private Integer viceBelt;

        /**
         * 纸巾盒，-1：不限0：不存在 1：存在
         */
        @XmlElement(name = "napkinbox")
        private Integer napkinBox;

        /**
         * 天窗站人， -1 不限 0：不存在 1：存在
         */
        @XmlElement
        private Integer headOutSunroof;

        /**
         * 特殊车辆 -1：不限 0：非特殊车型 1：校车 2：泥头车 3：高危车
         */
        @XmlElement
        private Integer specialVehicleTypeIdx;

        /**
         * 有无车牌 0:无牌车 1:有牌车 -1:不限
         */
        @XmlElement
        private Integer licensedVehicle;

        /**
         * 车牌遮挡 0:未遮挡车牌 1:遮挡车牌 -1:不限
         */
        @XmlElement
        private Integer obscuredPlate;

        /**
         * 车内人脸个数 0: 没有人脸 1:有人脸 -1:不限
         */
        @XmlElement
        private Integer faceNumber;

        /**
         * 是否是撞损车辆 -1：不限 0：不是 1：是
         */
        @XmlElement
        private Integer damagedVehicle;

        /**
         * 天窗 -1：不限 0：无 1：有
         */
        @XmlElement
        private Integer sunroof;

        /**
         * 行李架 -1：不限 0：无 1：有
         */
        @XmlElement
        private Integer roofRack;

        /**
         * 备胎 -1：不限 0：无 1：有
         */
        @XmlElement
        private Integer spareTire;

        /**
         * 车身喷字 -1：不限 0：无 1：有
         */
        @XmlElement
        private Integer graffiti;

        /**
         * 卡片 -1：不限 0：无 1：有
         */
        @XmlElement
        private Integer card;

        /**
         * 抽烟 -1:不限 0：未知 1：吸烟 2：未吸烟
         */
        @XmlElement
        private Integer smoking;

        /**
         * 面部遮挡 -1：不限 0：未知 1：面部遮挡 2：无面部遮挡
         */
        @XmlElement
        private Integer faceshadow;

        /**
         * 域编码列表
         */
        @XmlElementWrapper(name = "domainCodes")
        @XmlElement(name = "domainCode")
        private List<String> domainCodes;

        /**
         * 当deviceSource的值为0或-1时，此条件生效，其余情况不生效， 上传视频文件的id列表。 用于检索用户上传的离线视频分析产生的过车数据不填写时，表示选择所有视频文件
         */
        @XmlElementWrapper(name = "fileIdList")
        @XmlElement(name = "fileId")
        private List<String> fileIdList;

        /**
         * 搜索相似车牌是否开启，-1不涉及；0无；1有
         */
        @XmlElement
        private Integer plateSimilar;

        @XmlElementWrapper(name = "algorithms")
        @XmlElement(name = "algorithmCode")
        private List<String> algorithms;

        @XmlTransient
        public Long getStartTime() {
            return startTime;
        }

        public void setStartTime(Long startTime) {
            this.startTime = startTime;
        }

        @XmlTransient
        public Long getEndTime() {
            return endTime;
        }

        public void setEndTime(Long endTime) {
            this.endTime = endTime;
        }

        @XmlTransient
        public Integer getDeviceSource() {
            return deviceSource;
        }

        public void setDeviceSource(Integer deviceSource) {
            this.deviceSource = deviceSource;
        }

        @XmlTransient
        public String getPnr() {
            return pnr;
        }

        public void setPnr(String pnr) {
            this.pnr = pnr;
        }

        @XmlTransient
        public List<String> getColorList() {
            return colorList;
        }

        public void setColorList(List<String> colorList) {
            this.colorList = colorList;
        }

        @XmlTransient
        public String getDirec() {
            return direc;
        }

        public void setDirec(String direc) {
            this.direc = direc;
        }

        @XmlTransient
        public String getpType() {
            return pType;
        }

        public void setpType(String pType) {
            this.pType = pType;
        }

        @XmlTransient
        public String getpColor() {
            return pColor;
        }

        public void setpColor(String pColor) {
            this.pColor = pColor;
        }

        @XmlTransient
        public Long getCreateTime() {
            return createTime;
        }

        public void setCreateTime(Long createTime) {
            this.createTime = createTime;
        }

        @XmlTransient
        public Long getEndCreateTime() {
            return endCreateTime;
        }

        public void setEndCreateTime(Long endCreateTime) {
            this.endCreateTime = endCreateTime;
        }

        @XmlTransient
        public String getAlarmId() {
            return alarmId;
        }

        public void setAlarmId(String alarmId) {
            this.alarmId = alarmId;
        }

        @XmlTransient
        public String getCarType() {
            return carType;
        }

        public void setCarType(String carType) {
            this.carType = carType;
        }

        @XmlTransient
        public String getVehicleBrand() {
            return vehicleBrand;
        }

        public void setVehicleBrand(String vehicleBrand) {
            this.vehicleBrand = vehicleBrand;
        }

        @XmlTransient
        public String getVehicleSub() {
            return vehicleSub;
        }

        public void setVehicleSub(String vehicleSub) {
            this.vehicleSub = vehicleSub;
        }

        @XmlTransient
        public Integer getSunVisor() {
            return sunVisor;
        }

        public void setSunVisor(Integer sunVisor) {
            this.sunVisor = sunVisor;
        }

        @XmlTransient
        public Integer getViceSunVisor() {
            return viceSunVisor;
        }

        public void setViceSunVisor(Integer viceSunVisor) {
            this.viceSunVisor = viceSunVisor;
        }

        @XmlTransient
        public Integer getCarPendant() {
            return carPendant;
        }

        public void setCarPendant(Integer carPendant) {
            this.carPendant = carPendant;
        }

        @XmlTransient
        public Integer getGoods() {
            return goods;
        }

        public void setGoods(Integer goods) {
            this.goods = goods;
        }

        @XmlTransient
        public Integer getYearLogo() {
            return yearLogo;
        }

        public void setYearLogo(Integer yearLogo) {
            this.yearLogo = yearLogo;
        }

        @XmlTransient
        public String getYear() {
            return year;
        }

        public void setYear(String year) {
            this.year = year;
        }

        @XmlTransient
        public String getCameraSn() {
            return cameraSn;
        }

        public void setCameraSn(String cameraSn) {
            this.cameraSn = cameraSn;
        }

        @XmlTransient
        public Integer getMainDriver() {
            return mainDriver;
        }

        public void setMainDriver(Integer mainDriver) {
            this.mainDriver = mainDriver;
        }

        @XmlTransient
        public Integer getViceDriver() {
            return viceDriver;
        }

        public void setViceDriver(Integer viceDriver) {
            this.viceDriver = viceDriver;
        }

        @XmlTransient
        public Integer getMainCall() {
            return mainCall;
        }

        public void setMainCall(Integer mainCall) {
            this.mainCall = mainCall;
        }

        @XmlTransient
        public Integer getMainBelt() {
            return mainBelt;
        }

        public void setMainBelt(Integer mainBelt) {
            this.mainBelt = mainBelt;
        }

        @XmlTransient
        public Integer getViceBelt() {
            return viceBelt;
        }

        public void setViceBelt(Integer viceBelt) {
            this.viceBelt = viceBelt;
        }

        @XmlTransient
        public Integer getNapkinBox() {
            return napkinBox;
        }

        public void setNapkinBox(Integer napkinBox) {
            this.napkinBox = napkinBox;
        }

        @XmlTransient
        public Integer getHeadOutSunroof() {
            return headOutSunroof;
        }

        public void setHeadOutSunroof(Integer headOutSunroof) {
            this.headOutSunroof = headOutSunroof;
        }

        @XmlTransient
        public Integer getSpecialVehicleTypeIdx() {
            return specialVehicleTypeIdx;
        }

        public void setSpecialVehicleTypeIdx(Integer specialVehicleTypeIdx) {
            this.specialVehicleTypeIdx = specialVehicleTypeIdx;
        }

        @XmlTransient
        public Integer getLicensedVehicle() {
            return licensedVehicle;
        }

        public void setLicensedVehicle(Integer licensedVehicle) {
            this.licensedVehicle = licensedVehicle;
        }

        @XmlTransient
        public Integer getObscuredPlate() {
            return obscuredPlate;
        }

        public void setObscuredPlate(Integer obscuredPlate) {
            this.obscuredPlate = obscuredPlate;
        }

        @XmlTransient
        public Integer getFaceNumber() {
            return faceNumber;
        }

        public void setFaceNumber(Integer faceNumber) {
            this.faceNumber = faceNumber;
        }

        @XmlTransient
        public Integer getDamagedVehicle() {
            return damagedVehicle;
        }

        public void setDamagedVehicle(Integer damagedVehicle) {
            this.damagedVehicle = damagedVehicle;
        }

        @XmlTransient
        public Integer getSunroof() {
            return sunroof;
        }

        public void setSunroof(Integer sunroof) {
            this.sunroof = sunroof;
        }

        @XmlTransient
        public Integer getRoofRack() {
            return roofRack;
        }

        public void setRoofRack(Integer roofRack) {
            this.roofRack = roofRack;
        }

        @XmlTransient
        public Integer getSpareTire() {
            return spareTire;
        }

        public void setSpareTire(Integer spareTire) {
            this.spareTire = spareTire;
        }

        @XmlTransient
        public Integer getGraffiti() {
            return graffiti;
        }

        public void setGraffiti(Integer graffiti) {
            this.graffiti = graffiti;
        }

        @XmlTransient
        public Integer getCard() {
            return card;
        }

        public void setCard(Integer card) {
            this.card = card;
        }

        @XmlTransient
        public Integer getSmoking() {
            return smoking;
        }

        public void setSmoking(Integer smoking) {
            this.smoking = smoking;
        }

        @XmlTransient
        public Integer getFaceshadow() {
            return faceshadow;
        }

        public void setFaceshadow(Integer faceshadow) {
            this.faceshadow = faceshadow;
        }

        @XmlTransient
        public List<String> getDomainCodes() {
            return domainCodes;
        }

        public void setDomainCodes(List<String> domainCodes) {
            this.domainCodes = domainCodes;
        }

        @XmlTransient
        public List<String> getFileIdList() {
            return fileIdList;
        }

        public void setFileIdList(List<String> fileIdList) {
            this.fileIdList = fileIdList;
        }

        @XmlTransient
        public Integer getPlateSimilar() {
            return plateSimilar;
        }

        public void setPlateSimilar(Integer plateSimilar) {
            this.plateSimilar = plateSimilar;
        }

        @XmlTransient
        public List<String> getAlgorithms() {
            return algorithms;
        }

        public void setAlgorithms(List<String> algorithms) {
            this.algorithms = algorithms;
        }
    }

}
